#pragma once
#include <tl_expected/expected.hpp>
#include <future>
#include <string>
#include <iostream>
#include <thread>
#include <rclcpp/rclcpp.hpp>

#include "fishbot_behavior_tree/shared_resources_node.hpp"

namespace fishbot
{
    namespace behavior_tree
    {
        /**
         * @brief AsyncBehaviorBase 是一个抽象基类，
         *        继承自 SharedResourcesNode<BT::StatefulActionNode>BT::StatefulActionNode，
         *        用于在行为树中实现异步行为节点。它的主要作用是：
         *        1. 在行为树节点中执行异步任务，使用 std::future 和 std::promise 管理异步任务的执行和结果
         *        2. 实现了 BT::StatefulActionNode 的生命周期函数（onStart、onRunning 和 onHalted），用于管理异步任务的启动、运行和终止。
         */
        class AsyncBehaviorBase : public SharedResourcesNode<BT::StatefulActionNode>
        {
        public:
            AsyncBehaviorBase(const std::string &name, const BT::NodeConfiguration &config,
                              const std::shared_ptr<BehaviorContext> &shared_resources);
            virtual ~AsyncBehaviorBase();

            BT::NodeStatus onStart() override;
            BT::NodeStatus onRunning() override;
            void onHalted() override;
            // void resetStatus();

        protected:
            virtual tl::expected<bool, std::string> doWork() = 0;
            // virtual tl::expected<void, std::string> doHalt();
            virtual std::shared_future<tl::expected<bool, std::string>> &getFuture() = 0;

            // void notifyCanHalt();

        private:
            tl::expected<bool, std::string> runAsync();
            std::shared_future<tl::expected<bool, std::string>> execute_action_future_;
            std::promise<tl::expected<bool, std::string>> execute_action_promise_;
        };
    }
}